#include "bsp_spi.h"
#include "bsp_delay.h"


/*
 * @description 	: SPI初始化。
 * @param  			: 无
 * @return 			: 无
 */
void spi_init(ECSPI_Type *base)
{
	base->CONREG = 0;						/* 清零 */
	delayms(10);							/* 复位之后延时10ms */
	base->CONREG |= (1 << 0) | (1 << 3) | (1 << 4) | (0 << 18) | (7 << 20);

	
	/* SPI时钟前级分频 15， 后级分频4，SPI时钟频率为60MHz/15/4=1MHz */
	base->CONREG &=  ~((0xF << 8) | (0xF << 12));	/* 清零以前配置 */
	//base->CONREG |= (2 << 8) | (0xE << 12);
	base->CONREG |=  (0x9 << 12);
	
	
	/*
	 * bit[20] SPI通道0的时钟CPOL=1，时钟空闲时为高电平
	 * bit[16] SPI通道0的数据空闲时为高电平 0
	 * bit[12] SPI通道0的SS片选信号有效为低电平 0
	 * bit[8]  SPI通道0的 Wave From 波形选择时single burst还是multibust，
	 * bit[4]  SPI通道0的时钟极性，1 时钟空闲时为高电平
	 * bit[0]  SPI通道0的时钟相位，1 在第二个时钟源锁存数据（上升沿)
	 */
	base->CONFIGREG = 0;
	/* ICM20608 SPI 数据手册指明其CPOL=1, CPHA=1 */
	//base->CONFIGREG |= (1 << 0) | (1 << 4);
						// | (1 << 8)
						// | (0 << 12)
						// | (0 << 16) | (1 << 20);
	
	base->PERIODREG = 0;
	/* 正点原子查了NXP SDK 中是这个值 */
	base->PERIODREG |= 0x2000;
}

unsigned char spi_readwrite_onebyte(ECSPI_Type *base, unsigned char value)
{
	uint32_t txdata = value;
	uint32_t rxdata;

	/* 选择通道0 */
	base->CONREG &= ~(3 << 18);
	base->CONREG |= (0 << 18);

	while(!(base->STATREG & (1 << 0)));			/* wait for TXFIFO empty */
	base->TXDATA = txdata;						/* write txdata */


	while(!(base->STATREG & (1 << 3)));			/* wait for RXFIFO read ready */
	rxdata = base->RXDATA;						/* read rxdata */

	return rxdata;
}




